//导入express框架并创建实例
const express = require("express")
const app = express()

//导入body-parser中间件用于处理表单数据
const bodyParser = require('body-parser')

//导入cors用于处理跨域
const cors = require('cors')
//全局挂载
app.use(cors())

//当extend为false时，值为数组或字符串，反之值可以为任意类型。
app.use(bodyParser.urlencoded({ extended: false }))
//用于处理json格式数据
app.use(bodyParser.json())

app.use((req, res, next) => {
  //status = 0为成功，1为失败，用于处理失败情况
  res.cc = (err, status = 1) => {
    res.send({
      status,
      //这里判断这个error是错误对象还是字符串
      message: err instanceof Error ? err.message : err
    })
  }
  next()
})

const jwtconfig = require('./jwt_config/index')
//这里是解构赋值的写法，冒号后面是重命名
const { expressjwt: jwt } = require('express-jwt')
// 先挂载路由
const loginRouter = require('./router/login')
app.use('/api', loginRouter)

// 再应用JWT中间件（顺序调整）
app.use(jwt({
  secret: jwtconfig.jwtSecretKey, algorithms: ['HS256']
}).unless({
  // 修复路径匹配正则表达式
  path: [/^\/api\/send-code/, /^\/api\/verify-code/, /^\/api\/reset-password/, /^\/api\/login/, /^\/api\/register/]
}))

//导入Joi验证库
const Joi = require('joi')

// 错误处理中间件（修复参数和逻辑）
app.use((err, req, res, next) => {
  // JWT认证失败
  if (err.name === 'UnauthorizedError') {
    return res.cc('未登录或登录状态已过期', 401)
  }
  // 数据验证失败
  if (err instanceof Joi.ValidationError) {
    return res.cc(err.details[0].message)
  }
  // 其他未知错误
  res.cc('服务器内部错误', 500)
})

//绑定并监听主机和端口
app.listen(3007, () => {
  console.log('http://127.0.0.1:3007');
})